O que são modelos de linguagem?
Os aplicativos de IA generativa são alimentados por modelos de linguagem, que são um tipo especializado de modelo de machine learning que você pode usar para executar tarefas de processamento de linguagem natural (NLP), incluindo:
- Determinar sentimento ou classificar de outra forma o texto em idioma natural.
- Resumir um texto.
- Comparar várias fontes de texto quanto à similaridade semântica.
- Geração de nova linguagem natural.
Embora os princípios matemáticos por trás desses modelos de linguagem possam ser complexos, uma compreensão básica da arquitetura usada para implementá-los pode ajudá-lo a obter uma compreensão conceitual de como eles funcionam.
Modelos de transformador
Os modelos de machine learning para processamento de linguagem natural evoluíram ao longo de muitos anos. Os modelos de linguagem grande de ponta da atualidade são baseados na arquitetura de transformador, que se baseia e amplia algumas técnicas que foram comprovadamente bem-sucedidas na modelagem de vocabulários para dar suporte a tarefas de NLP e, em particular, na geração de linguagem. Os modelos de transformador são treinados com grandes volumes de texto, permitindo que eles representem as relações semânticas entre palavras e usem essas relações para determinar sequências prováveis de texto que fazem sentido. Modelos transformadores com um vocabulário grande o suficiente são capazes de gerar respostas de linguagem que são difíceis de distinguir das respostas humanas.
A arquitetura do modelo de transformador consiste em dois componentes ou blocos:
- Um bloco codificador que cria representações semânticas do vocabulário de treinamento.
- Um bloco decodificador que gera novas sequências de linguagem.
- O modelo é treinado com um grande volume de texto em linguagem natural, geralmente proveniente da Internet ou de outras fontes públicas de texto.
- As sequências de texto são divididas em tokens (por exemplo, palavras individuais) e o bloco do codificador processa essas sequências de tokens usando uma técnica chamada atenção para determinar relações entre tokens (por exemplo, quais tokens influenciam a presença de outros tokens em uma sequência, tokens diferentes que são comumente usados no mesmo contexto e assim por diante).
- A saída do codificador é uma coleção de vetores (matrizes numéricas de vários valores) em que cada elemento do vetor representa um atributo semântico dos tokens. Esses vetores são chamados de inserções.
- O bloco do decodificador funciona em uma nova sequência de tokens de texto e usa as inserções geradas pelo codificador para gerar uma saída de linguagem natural apropriada.
- Por exemplo, dada uma sequência de entrada como "Quando meu cachorro era", o modelo pode usar a técnica de atenção para analisar os tokens de entrada e os atributos semânticos codificados nas inserções para prever uma conclusão apropriada da frase, como "um filhotinho".
Na prática, as implementações específicas da arquitetura variam – por exemplo, o modelo BERT (Representações de codificador bidirecional de transformadores) desenvolvido pelo Google para dar suporte ao mecanismo de pesquisa usa apenas o bloco codificador, enquanto o modelo Transformador pré-treinado generativo (GPT) desenvolvido pela OpenAI usa apenas o bloco decodificador.
Embora uma explicação completa de todos os aspectos dos modelos transformadores esteja além do escopo deste módulo, uma explicação de alguns dos principais elementos em um transformador pode ajudar você a ter uma noção de como eles dão suporte à IA generativa.
Geração de tokens
A primeira etapa no treinamento de um modelo transformador é decompor o texto de treinamento em tokens, em outras palavras, identificar cada valor de texto exclusivo. Para simplificar, você pode pensar em cada palavra distinta no texto de treinamento como um token (embora, na realidade, os tokens possam ser gerados para palavras parciais ou combinações de palavras e pontuação).
Por exemplo, considere a seguinte sentença:
I heard a dog bark loudly at a cat
Para tokenizar esse texto, você pode identificar cada palavra discreta e atribuir IDs de token a elas. Por exemplo:
- I (1)
- heard (2)
- a (3)
- dog (4)
- bark (5)
- loudly (6)
- at (7)
- *("a" is already tokenized as 3)*
- cat (8)
A frase agora pode ser representada com os tokens: {1 2 3 4 5 6 7 3 8}. Da mesma forma, a frase “Eu ouvi um gato” poderia ser representada como {1 2 3 8}.
À medida que você continua a treinar o modelo, cada novo token no texto de treinamento é adicionado ao vocabulário com as IDs de token apropriadas:
- miau (9)
- skate (10)
- e assim por diante...
Com um conjunto suficientemente grande de texto de treinamento, um vocabulário de milhares de tokens poderia ser compilado.
Incorporações
Embora possa ser conveniente representar tokens como IDs simples, essencialmente criando um índice para todas as palavras do vocabulário, elas não nos dizem nada sobre o significado das palavras nem as relações entre elas. Para criar um vocabulário que englobe as relações semânticas entre os tokens, definimos vetores contextuais, conhecidos como inserções, para eles. Vetores são representações numéricas de valores múltiplos de informações, por exemplo [10, 3, 1] em que cada elemento numérico representa um atributo específico das informações. Para tokens de linguagem, cada elemento do vetor de um token representa algum atributo semântico do token. As categorias específicas dos elementos dos vetores em um modelo de linguagem são determinadas durante o treinamento com base na frequência com que as palavras são usadas juntas ou em contextos semelhantes.
Os vetores representam linhas no espaço multidimensional, descrevendo a direção e a distância ao longo de múltiplos eixos (você pode impressionar seus amigos matemáticos chamando isso de amplitude e magnitude). Pode ser útil pensar nos elementos em um vetor de incorporação de um token como a representação das etapas ao longo de um caminho no espaço multidimensional. Por exemplo, um vetor com três elementos representa um caminho no espaço tridimensional no qual os valores dos elementos indicam as unidades percorridas para frente/para trás, esquerda/direita e para cima/baixo. No geral, o vetor descreve a direção e a distância do caminho da origem ao fim.
Os elementos dos tokens no espaço de inserções representam cada um alguns atributos semânticos do token, de modo que tokens semanticamente semelhantes devem resultar em vetores que têm uma orientação semelhante – em outras palavras, eles apontam na mesma direção. Uma técnica chamada similaridade de cosseno é usada para determinar se dois vetores têm direções semelhantes (independentemente da distância) e, portanto, representam palavras semanticamente vinculadas. Como um exemplo simples, suponha que as inserções para nossos tokens consistem em vetores com três elementos, por exemplo:
- 4 ("cachorro"): [10,3,2]
- 8 ("gato"): [10,3,1]
- 9 ("cachorrinho"): [5,2,1]
- 10 ("skate"): [-3,3,2]
Podemos plotar esses vetores no espaço tridimensional, assim:
Os vetores de incorporação para "cachorro" e "filhote de cachorro" descrevem um caminho ao longo de uma direção quase idêntica, que também é bastante semelhante à direção para "gato". O vetor de incorporação de “skate”, no entanto, descreve o percurso em uma direção muito diferente.
Observação
O exemplo acima mostra um modelo de exemplo simples no qual cada inserção tem apenas três dimensões. Modelos de linguagem reais têm muito mais dimensões.
Há várias maneiras de calcular as inserções apropriadas para um determinado conjunto de tokens, incluindo algoritmos de modelagem de linguagem, como Word2Vec ou o bloco codificador em um modelo transformador.
Attention
Os blocos codificador e decodificador em um modelo transformador incluem várias camadas que formam a rede neural do modelo. Não precisamos entrar nos detalhes de todas essas camadas, mas é útil considerar um dos tipos de camadas que é usado em ambos os blocos: camadas de atenção. A atenção é uma técnica usada para examinar uma sequência de tokens de texto e tentar quantificar a força das relações entre eles. Em particular, autoatenção envolve considerar como outros tokens relativos a um token específico influenciam o significado desse token.
Em um bloco codificador, cada token é cuidadosamente examinado no contexto, e uma codificação apropriada é determinada para sua inserção de vetor. Os valores de vetor são baseados na relação entre o token e outros tokens com os quais ele aparece com frequência. Essa abordagem contextualizada significa que a mesma palavra pode ter várias inserções dependendo do contexto em que é usada; por exemplo, "the bark of a tree" significa algo diferente de "I heard a dog bark".
Em um bloco de decodificador, as camadas de atenção são usadas para prever o próximo token em uma sequência. Para cada token gerado, o modelo tem uma camada de atenção que leva em conta a sequência de tokens até esse ponto. O modelo considera quais dos tokens são os mais influentes ao considerar qual deverá ser o próximo token. Por exemplo, dada a sequência "I heard a dog bark", a camada de atenção pode atribuir maior peso aos tokens "heard" e "dog" ao considerar a próxima palavra na sequência:
Eu ouvi um cachorro [latir]
Lembre-se de que a camada de atenção está trabalhando com representações de vetor numérico dos tokens, não com o texto real. Em um decodificador, o processo começa com uma sequência de inserções de token que representam o texto a ser preenchido. A primeira coisa que acontece é que outra camada de codificação posicional adiciona um valor a cada inserção para indicar sua posição na sequência:
- [1,5,6,2] (Eu)
- [2,9,3,1] (ouvi)
- [3,1,1,2] (um)
- [4,10,3,2] (cachorro)
Durante o treinamento, a meta é prever o vetor do token final na sequência com base nos tokens anteriores. A camada de atenção atribui um peso numérico a cada token na sequência até aquele momento. Ela usa esse valor para executar um cálculo nos vetores ponderados e produz uma pontuação de atenção que pode ser usada para calcular o vetor possível para o próximo token. Na prática, uma técnica chamada multi-head attention usa elementos diferentes das inserções para calcular várias pontuações de atenção. Em seguida, uma rede neural é usada para avaliar todos os tokens possíveis para determinar o token mais provável com o qual continuar a sequência. O processo continua iterativamente para cada token na sequência, com a sequência de saída até aquele momento sendo usada regressivamente como informação para a próxima iteração, essencialmente criando o token de saída, um de cada vez.
A animação a seguir mostra uma representação muito simplificada de como isso funciona. Na realidade, os cálculos executados pela camada de atenção são mais complexos; mas os princípios podem ser simplificados conforme mostrado:
- Uma sequência de inserções de token é alimentada na camada de atenção. Cada token é representado como um vetor de valores numéricos.
- A meta em um decodificador é prever o próximo token na sequência, que também será um vetor que se alinhará a uma inserção no vocabulário do modelo.
- A camada de atenção avalia a sequência até aquele momento e atribui pesos a cada token para representar sua influência relativa sobre o próximo token.
- Os pesos podem ser usados para calcular um novo vetor para o próximo token com uma pontuação de atenção. A atenção multi-head usa elementos diferentes nas inserções para calcular vários tokens alternativos.
- Uma rede neural totalmente conectada usa as pontuações dos vetores calculados para prever o token mais provável de todo o vocabulário.
- A saída prevista é acrescentada à sequência até aquele momento, que é usada como entrada para a próxima iteração.
Durante o treinamento, a sequência real de tokens é conhecida, apenas mascaramos os que vêm posteriormente na sequência em relação à posição do token que está sendo considerada no momento. Como em qualquer rede neural, o valor previsto para o vetor de token é comparado com o valor real do próximo vetor na sequência e a perda é calculada. Em seguida, os pesos são ajustados incrementalmente para reduzir a perda e aprimorar o modelo. Quando usada para inferência (previsão de uma nova sequência de tokens), a camada de atenção treinada aplica pesos que preveem o token mais provável no vocabulário do modelo que está semanticamente alinhado à sequência até aquele momento.
O que tudo isso significa é que um modelo de transformador como GPT-4 (o modelo por trás do ChatGPT e do Bing) foi projetado para receber uma entrada de texto (chamada de prompt) e gerar uma saída sintaticamente correta (chamada de conclusão). Na verdade, a "mágica" do modelo é que ele tem a capacidade de gerar uma sequência de uma frase coerente. Essa capacidade não implica nenhum "conhecimento" ou "inteligência" por parte do modelo; apenas um vocabulário grande e a capacidade de gerar sequências significativas de palavras. No entanto, o que torna um modelo de linguagem grande, como o GPT-4, tão poderoso, é o grande volume de dados com os quais ele foi treinado (dados públicos e licenciados da Internet) e a complexidade da rede. Isso permite que o modelo gere conclusões baseadas nas relações entre palavras no vocabulário em que o modelo foi treinado, frequentemente gerando um resultado indistinguível de uma resposta humana para o mesmo prompt.